package com.generator.util;

public class IDUtils {

    private static final long BASE = -1;

    /**
     * 计算周期值
     * @param id ID
     * @param startOffset 起始偏移量
     * @param bits 所占位数
     * @return epoch
     */
    public static long epoch(long id,int startOffset,int bits) {
        return compute(id,startOffset,bits);
    }

    /**
     * 计算周期值
     * @param id ID
     * @param startOffset 起始偏移量
     * @param bits 所占位数
     * @return dataCenterId,数据中心ID
     */
    public static long dataCenterId(long id,int startOffset,int bits) {
        return compute(id,startOffset,bits);
    }

    /**
     * 计算周期值
     * @param id ID
     * @param startOffset 起始偏移量
     * @param bits 所占位数
     * @return workerId
     */
    public static long workerId(long id,int startOffset,int bits) {
        return compute(id,startOffset,bits);
    }

    /**
     * 计算周期值
     * @param id ID
     * @param bits 所占位数
     * @return epoch,起始偏移量为0
     */
    public static long sequence(long id,int bits) {
        return compute(id,0,bits);
    }

    public static long compute(long id,int startOffset,int bits) {
        return (~(BASE << bits)) & (id >> startOffset);
    }
}
